/*
 * Created on 09-oct-2008
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.gestores;

import com.beans.AsociacionBean;
import com.beans.EventoBean;
import com.beans.NoticiaBean;
import com.beans.UsuarioBean;
import com.debug.Debug;
import com.util.Conectar;
import com.util.Utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.naming.NamingException;

/**
 * @author vPalomo
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class GestionAsociaciones {
    public final static String CATEGORIA = "9";

    private GestionAsociaciones() {
    } //Constructor privado, para que nadie pueda usarle

    public static synchronized GestionAsociaciones getInstance() {
        return new GestionAsociaciones();
    }

    public boolean crearAsociacion(AsociacionBean datos, UsuarioBean usuario) {
        if (!usuarioValido(usuario)) {
            Debug.getInstance().putLog(null, "[GestionAsociaciones]"+usuario.getNick()+": intenta crear asociacion y no tiene permisos");
            return false;
        }
        boolean result = false;
        //Hace el insert en la base de datos.
        String SQL = "insert into asociaciones(cif,razon,sede,presidente,email,web,telefono,tipo,fechaactualizacion,historica)" +
                " values(?,?,?,?,?,?,?,?,?,'NO')";
        Connection con = null;
        PreparedStatement insert = null;
        try {
            con = Conectar.getConnection();
            insert = con.prepareStatement(SQL);
            insert.setString(1, datos.getCIF());
            insert.setString(2, datos.getRazon());
            insert.setString(3, datos.getSede());
            insert.setString(4, datos.getPresidente());
            insert.setString(5, datos.getEmail());
            insert.setString(6, datos.getWeb());
            insert.setString(7, datos.getTelefono());
            insert.setString(8, datos.getTipo());
            String hoy = Utils.fechaActualString();
            insert.setString(9, Utils.fechaParaMysql(hoy));
            System.out.println("Consulta: " + insert.toString());
            insert.executeUpdate();
            Debug.getInstance().putLog(null, "[GestionAsociaciones]" + usuario.getNick() + ": " + insert.toString());
            result = true;
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (insert != null) {
                    insert.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }

    /**
     * Modifica en la base de datos los datos de la asociacion que pasemos. El usuario tiene que tener permisos para asociaciones
     * @param asociacion
     * @param usuario
     * @return true si se ha podido hacer la modificacion y false si no se ha podido.
     */
    public boolean modificarAsociacion(AsociacionBean asociacion, UsuarioBean usuario) {
        Connection conexion = null;
        PreparedStatement updateStatement = null;
        boolean result = false;
        if (!usuarioValido(usuario)) {
             Debug.getInstance().putLog(null, "[GestionAsociaciones]"+usuario.getNick()+": intenta modificar asociacion y no tiene permisos");
            return false;
        }
        try {
            conexion = Conectar.getConnection();
            String updateSQL = "update asociaciones set razon=? ,cif=? ,sede=? ,presidente=? ,email=? ,web=? ,telefono=? ,tipo=? ,fechaactualizacion=?" +
                    "where idasociacion=?";

            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);

            updateStatement.setString(1, asociacion.getRazon());
            updateStatement.setString(2, asociacion.getCIF());
            updateStatement.setString(3, asociacion.getSede());
            updateStatement.setString(4, asociacion.getPresidente());
            updateStatement.setString(5, asociacion.getEmail());
            updateStatement.setString(6, asociacion.getWeb());
            updateStatement.setString(7, asociacion.getTelefono());
            updateStatement.setString(8, asociacion.getTipo());
            String hoy = Utils.fechaActualString();
            updateStatement.setString(9, Utils.fechaParaMysql(hoy));
            updateStatement.setString(10, asociacion.getIdAsociacion());

            updateStatement.executeUpdate();
            result = true;
            Debug.getInstance().putLog(null, "[GestionAsociaciones]" + usuario.getNick() + ": " + updateStatement.toString());
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (updateStatement != null) {
                    updateStatement.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }

    /**
     * Pone o quita la marca de historica a una asociacion
     * @param estado true pone como historica la asociacion, false la saca del historico
     * @param idAsociacion
     * @param usuario
     * @return true si se ha podido realizar y false si hay algun problema.
     */
    public boolean ponerHistorica(boolean estado, String idAsociacion, UsuarioBean usuario) {
        if (!usuarioValido(usuario)) {
             Debug.getInstance().putLog(null, "[GestionAsociaciones]"+usuario.getNick()+": intenta hacer historica una asociacion y no tiene permisos");
            return false;
        }
        Connection conexion = null;
        PreparedStatement updateStatement = null;
        String sEstado;
        boolean result = false;
        AsociacionBean asociacion = this.consultaAsociacion(idAsociacion);

        if (!usuarioValido(usuario)) {
            return false;
        }
        if (estado) {
            sEstado = "SI";
        } else {
            sEstado = "NO";
        }
        try {
            conexion = Conectar.getConnection();
            String updateSQL = "UPDATE asociaciones SET historica=?  WHERE idasociacion = ?";

            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);
            updateStatement.setString(1, sEstado);
            updateStatement.setString(2, idAsociacion);
            updateStatement.executeUpdate();
            System.out.println(updateStatement.toString());
            result = true;
            Debug.getInstance().putLog(null, "[GestionAsociaciones](poner historica)" + usuario.getNick() + ": " + updateStatement.toString());
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (updateStatement != null) {
                    updateStatement.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 
     * @param tipo Si queremos filtrar la lista por algun tipo. El id del tipo, sino en blanco ""
     * @param historica Si queremos que nos muestre solo las historica va a true, para el resto a false
     * @return
     */
    public ArrayList listaAsociaciones(String tipo, boolean historica) {
        ArrayList lista = null;
        Connection conexion = null;
        PreparedStatement selectStatement = null;
        String sHistorica;
        if (historica) {
            sHistorica = "SI";
        } else {
            sHistorica = "NO";
        }

        try {
            conexion = Conectar.getConnection();
            String selectCustomerStr = "SELECT * FROM asociaciones where historica='" + sHistorica + "'";
            if (!tipo.equals("")) {
                selectCustomerStr += " and tipo=" + tipo;
            }
            selectCustomerStr += " order by razon";
            selectStatement = conexion.prepareStatement(selectCustomerStr);
            ResultSet rs = selectStatement.executeQuery();
            AsociacionBean asociacion;
            lista = new ArrayList();
            while (rs.next()) {
                asociacion = new AsociacionBean();
                asociacion.setIdAsociacion(rs.getString("idAsociacion"));
                asociacion.setCIF(rs.getString("cif"));
                asociacion.setRazon(rs.getString("razon"));
                asociacion.setSede(rs.getString("sede"));
                asociacion.setPresidente(rs.getString("presidente"));
                asociacion.setEmail(rs.getString("email"));
                asociacion.setTelefono(rs.getString("telefono"));
                asociacion.setWeb(rs.getString("web"));
                asociacion.setTipo(rs.getString("tipo"));
                asociacion.setFechaactualizacion(Utils.fecha(rs.getString("fechaactualizacion")));
                lista.add(asociacion);
            }
            Debug.getInstance().putLog(null, "[ListaAsociaciones]Se a cargado el listado completo (es una clase de gestion)");
            rs.close();
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        try {
            if (selectStatement != null) {
                selectStatement.close();
            }
            if (conexion != null) {
                conexion.close();
            }
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

        return lista;
    }

    /**
     * Devuelve la noticia correspondiente con el id que pasemos, si el id no existe devuelve null
     * @param idNoticia
     * @return null o la noticia
     */
    public AsociacionBean consultaAsociacion(String idAsociacion) {
        Connection conexion = null;
        AsociacionBean asociacion = null;
        PreparedStatement selectStatement = null;
        try {
            conexion = Conectar.getConnection();
            System.out.println("Consultando " + idAsociacion);
            String selectCustomerStr = "SELECT * FROM asociaciones " +
                    "WHERE idasociacion = ?";

            selectStatement = (PreparedStatement) conexion.prepareStatement(selectCustomerStr);
            //System.out.println("Id en la consulta: " + id);
            selectStatement.setString(1, idAsociacion);
            ResultSet rs = selectStatement.executeQuery();

            String aux = "";
            if (rs.next()) {
                asociacion = new AsociacionBean();
                asociacion.setIdAsociacion(idAsociacion);
                asociacion.setCIF(rs.getString("cif"));
                asociacion.setRazon(rs.getString("razon"));
                asociacion.setSede(rs.getString("sede"));
                asociacion.setPresidente(rs.getString("presidente"));
                asociacion.setEmail(rs.getString("email"));
                asociacion.setTelefono(rs.getString("telefono"));
                asociacion.setWeb(rs.getString("web"));
                asociacion.setTipo(rs.getString("tipo"));
                asociacion.setFechaactualizacion(rs.getString("fechaactualizacion"));

            } else {

            }
            rs.close();

        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (selectStatement != null) {
                    selectStatement.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return asociacion;
    }

    /**
     * Comprueba si el usuario pasado tiene permisos en los Asociaciones 
     * @param usu Usuario del que queremos hacer la consulta
     * @return true si el usuario es valido, false si no tiene permisos
     * en la categoria de Asociaciones.
     */
    private boolean usuarioValido(UsuarioBean usu) {
        if (!usu.categoriaValida(CATEGORIA)) { //El 8 indica que Asociaciones es la categoria 8, si fuese otra habria que cambiarlo
            Debug.getInstance().putLog(null, "[GestionAsociaciones]"+usu.getNick()+": El usuario no es valido para Asociaciones. FORZANDO");
            return false;
        }
        return true;

    }
}
